package com.yoyo.itravel.utils;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;

/**
 * @Description 发送邮件工具类
 * 
 * @author HZX
 * @date 2020年4月14日 下午9:07:08
 */
public class MailUtils {
	
	// 邮件服务器主机名
	// QQ邮箱的 SMTP 服务器的地址为 smtp.qq.com
	private static String emilSMTPHost = "smtp.qq.com";
	private static String fromEmail = "2801481043@qq.com"; // 发件人邮箱
	private static String fromEmailPassword = "cedmgkknjenidedc"; // 发件人邮箱授权码（开启POP3/SMTP服务）
	
	// 私有化构造器
	private MailUtils() {};
	
	/**
	 * @Description 给具体的某一个邮箱地址发送邮件（邮件单发）
	 *
	 * @param toEmail 收件人邮箱地址
	 * @param emailContent 邮件内容
	 * @param subject 邮件的主题
	 */
	public static void senMail(String toEmail, String emailContent, String subject) {
		if (StringUtils.isEmpty(toEmail, emailContent)) {
			throw new RuntimeException("收件人邮箱地址或邮件内容为空，邮件无法发送...");
		}
		// 构建Properties对象，设置配置文件
		Properties props = new Properties();
		// 开启debug调试
		props.setProperty("mail.debug", "true");
		// 发送服务器需要身份验证
		props.setProperty("mail.smtp.auth", "true");
		// 设置端口号
		props.put("mail.smtp.port", 465);
		// 设置邮件服务器主机名
		props.setProperty("mail.smtp.host", emilSMTPHost);
		// 发送邮件的协议名称
		props.setProperty("mail.transport.protocol", "smtp");
		
		// SSL认证，腾讯邮箱是基于SSL加密的，所以需要开启才可以使用
		MailSSLSocketFactory msf;
		try {
			msf = new MailSSLSocketFactory();
			msf.setTrustAllHosts(true);
			// 设置是否使用安全连接
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.ssl.socketFactory", msf);
		} catch (GeneralSecurityException e1) {
			e1.printStackTrace();
		}

		// 创建会话
		Session session = Session.getInstance(props);
		// 实例化邮件对象
		Message msg = new MimeMessage(session);
		
		try {
			// 设置发件人
			msg.setFrom(new InternetAddress(fromEmail));
			// 设置发送邮件的时间
			msg.setSentDate(new Date());
			// 设置邮件的内容和文本格式
			msg.setContent(emailContent, "text/html; charset=UTF-8");
			// 设置邮件的主题
			msg.setSubject(subject);
			
			// 通过session对象获得邮差对象
			Transport transport = session.getTransport();
			// 连接发送者的邮箱账户
			// 密码不是邮箱的登陆密码，而是在开启SMTP服务时所获取到的授权码
			transport.connect(emilSMTPHost, fromEmail, fromEmailPassword);
			// 发送邮件
			transport.sendMessage(msg, new Address[] { new InternetAddress(toEmail) });
			// 关闭传输
			transport.close();
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}
	
	
	
}
